let promise = new Promise((resolve, reject) => {
  resolve('First resolve');
})


// 通过return 传递结果
// promise.then(res => {
//   return res; // 普通值
// })
// .then(res => {
//   console.log(res); // First resolve
// })


// 通过新的promise resolve结果
// promise.then(res => {
//   return res;
// })
// .then(res => {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       resolve(res);
//     }, 2000)
//   })
// })
// .then(res => {
//   console.log(res); // First resolve
// })


// 通过新的promise reject原因
// promise.then(res => {
//   return res;
// })
// .then(res => {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       reject('Error');
//     }, 2000)
//   })
// })
// .then(res => {
//   console.log(res);
// }, err => {
//   console.log('Rejected: ' + err); // Rejected Error
// })


// then 走了失败的回调函数后，再走then
// promise.then(res => {
//   return res;
// })
// .then(res => {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       reject('Error');
//     }, 2000)
//   })
// })
// .then(res => {
//   console.log(res);
// }, err => {
//   console.log('Rejected: ' + err); // Rejected Error
//   // 默认 return undefined
// })
// .then(res => {
//   console.log(res); // undefined
//   console.log('Fulfilled: ' + res); // Fulfilled: undefined
// }, err => {
//   console.log('second: ' + err);
// })


// then中使用 throw new Error
// promise.then(res => {
//   return res;
// })
// .then(res => {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       reject('Error');
//     }, 2000)
//   })
// })
// .then(res => {
//   console.log(res);
// }, err => {
//   console.log('Rejected: ' + err); // Rejected Error
//   // 默认 return undefined
// })
// .then(res => {
//   throw new Error('Throw Error');
// })
// .then(res => {
//   console.log('third: ' + res);
// }, err => {
//   console.log('Exception: ' + err); // Exception: Error: Throw Error
// })


// 使用catch 捕获异常
promise.then(res => {
  return res;
})
.then(res => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject('Error');
    }, 2000)
  })
})
.then(res => {
  console.log(res);
}, err => {
  console.log('Rejected: ' + err); // Rejected Error
  // 默认 return undefined
})
.then(res => {
  throw new Error('Throw Error');
})
.then(res => {
  console.log('third: ' + res);
},
// err => {
//   console.log('Then: ' + err); // Then: Error: Throw Error
// }
)
.catch(err => {
  console.log('Catch: ' + err); // Catch: Error: Throw Error
  return 'Catch Error';
})
.then(res => {
  console.log('Then: ' + res); // Then: Catch Error
})

// catch在Promise的源码层面上就是一个then，Catch也是遵循then的运行原则的

// 链式
// promise.then(() => {

// }) // return new Promise().then
// .then()

// 一:
let promise2 = promise.then((value) => {
  // return 第一次返回的新的Promise结果
}).then((value) => {
  // return 第二次返回的新的Promise结果
}) // promise2 = 第二次返回的新的Promise结果

// 二:
let promise2 = promise.then((value) => {
  // return 第一次返回的新的Promise结果
}) // promise2 = 第一次返回的新的Promise结果

promise2.then(() => {

})


/**
 * 成功的条件
 * then return 普通的JavaScript value
 * then return 新的promise成功态的结果 value
 * 
 * 失败的条件
 * then return 新的promise失败态的原因 reason
 * then 抛出了异常  throw new Error
 * 
 * promise 链式调用
 * return this
 * then 不具备 this
 * return new Promise
 * 
 */